﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Locadora.BLL.DAL;
using Locadora.TOB;
using System.Transactions;

namespace Locadora.BLL
{
    public class LocacaoBLL
    {
        TB_LOCACAO m_tb = null;

        public LocacaoBLL()
        {

        }
        public LocacaoBLL(TB_LOCACAO tb)
        {
            m_tb = tb;
        }

        public static List<TB_LOCACAO> Listar()
        {
            return LocacaoDAL.Listar();
        }

        public static TB_LOCACAO Listar(decimal? id)
        {
            return LocacaoDAL.Listar(id);
        }

        public static List<TB_LOCACAO> ListarByUsuario(string idUsuario)
        {
            return LocacaoDAL.ListarByUsuario(idUsuario);
        }

        public static List<TB_LOCACAO> ListarLocadoByUsuario(string idUsuario)
        {
            return LocacaoDAL.ListarLocadoByUsuario(idUsuario);
        }

        public static List<LocacaoTOB> IqueryableListarLocadoByUsuario(string idUsuario)
        {
            return LocacaoDAL.IqueryableListarLocadoByUsuario(idUsuario);
        }

        public static List<TB_LOCACAO> ListarByDvd(decimal idDvd)
        {
            return LocacaoDAL.ListarByDvd(idDvd);
        }

        public void Inserir()
        {
            LocacaoDAL.Inserir(m_tb);
        }

        public void Excluir()
        {
            LocacaoDAL.Excluir(m_tb);
        }

        internal static void Devolver(decimal coDvd, decimal coLocacao,string coUsuario)
        {
            LocacaoDAL.Devolver(coDvd,coLocacao);
            //TB_LOCACAO tbl = LocacaoDAL.ListarByLocacao(coLocacao);
            //if (tbl.DT_DEVOLUCAO < DateTime.Now)
            //{
            //    TB_CLASSIFICACAO tb = new TB_CLASSIFICACAO();
            //    tb.CO_LOCACAO = coLocacao;
            //    tb.DS_COMENTARIO = "Não devolveu o filme na data agendada.";
            //    tb.TP_CLASSIFICACAO = false;// tipo.Replace('/', ' ').Trim() == "0" ? false : true;
            //    tb.GD_USUARIO = coUsuario;
            //    tb.DT_CADASTRO = DateTime.Today;

            //    ClassificacaoBLL bll = new ClassificacaoBLL(tb);
            //    bll.Inserir();
            //}
            LiberarReserva(coDvd);
        }

        private static void LiberarReserva(decimal coDvd)
        {
            LocacaoDAL.LiberarReserva(coDvd);
        }

        public List<TB_DVD> ListarByCoUsuario(string coUsuario)
        {
            throw new NotImplementedException();
        }

        public static List<LocacaoTOB> IqueryableListarSolicitadoParaUsuario(string p)
        {
            return LocacaoDAL.IqueryableListarSolicitadoParaUsuario(p);
        }

        public void Aprovar(decimal p, decimal coLocacao)
        {
            LocacaoDAL.Aprovar(p, coLocacao);
        }

        public void NaoAprovar(decimal id, decimal coLocacao, UsuarioTOB proprietario, UsuarioTOB solicitante)
        {
            using (TransactionScope trans = new TransactionScope())
            {
                try
                {
                    LocacaoDAL.NaoAprovar(id, coLocacao);
                    //Atualiza flag locacao para false
                    DvdDAL.UpdateFlagLocacao(id, false);
                    //commit
                    trans.Complete();
                    trans.Dispose();
                    TB_DVD dvd= DvdBLL.Listar(id);
                    StringBuilder sbMensagem = new StringBuilder();
                    string usuario = solicitante.DS_NOME;
                    sbMensagem.Append("Prezado " + usuario + ", ");

                    string filme = dvd.DS_TITULO;
                    sbMensagem.Append("A solicitação do Filme: " + filme);
                    sbMensagem.Append(" foi negada");


                    EmailBLL email = new EmailBLL();

                    email.SpeedMail(proprietario.DS_EMAIL,solicitante.DS_EMAIL, "DVD Solicitação Negada",sbMensagem.ToString());
                  


                }
                catch (Exception)
                {
                    //rollback
                    trans.Dispose();
                    throw;
                }
            }
        }

        //paginado
        public static List<LocacaoTOB> IqueryableListarSolicitadoParaUsuario(int start, int offset, string p)
        {
            return LocacaoDAL.IqueryableListarSolicitadoParaUsuario(start, offset, p);
        }

        public static int GetTotalLocacoes(string p)
        {
            return LocacaoDAL.GetTotalLocacoes(p);
        }

        public void Cancelar(decimal id, decimal coLocacao)
        {
            using (TransactionScope trans = new TransactionScope())
            {
                try
                {
                    LocacaoDAL.Cancelar(id, coLocacao);
                    //Liberar DVD para novas solicitações
                    DvdDAL.UpdateFlagLocacao(id, false);
                    //commit
                    trans.Complete();
                    trans.Dispose();
                }
                catch (Exception)
                {
                    //rollback
                    trans.Dispose();
                    throw;
                }
            }
        }



        internal static List<TB_LOCACAO> ListarReservaByUsuario(string p)
        {
            return LocacaoDAL.ListarReservaByUsuario(p);
        }
    }
}
